import java.util.HashSet;
import java.util.Set;

/**
 * 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 */
public class LengthOfLongestSubstring {

    public static int lengthOfLongestSubstringByHashMap(String s) {
        // 特殊情况即刻返回
        if (s == null || s.length() == 0) {
            return 0;
        }

        // 当前子字符串长度
        int currentLength = 1;
        // 最大子字符串长度
        int maxLength = 1;
        // set 存放字符串中的每个字符
        Set<Character> set = new HashSet<>(s.length());
        // set 还没有存放值，所以首元素无需与其他值做比较，直接放入 set 中
        set.add(s.charAt(0));

        // 从第二个元素开始遍历字符串
        for (int i = 1; i < s.length(); i++) {
            // 获取当前字符
            char c = s.charAt(i);
            // 当遇到重复元素，不加入 set 中，也不做当前子字符串自增
            if (set.contains(c)) {
                // 实时获取最大子字符串
                if (maxLength < currentLength) {
                    maxLength = currentLength;
                }
                // 重置为 1，开始新一轮的子字符串长度计算
                currentLength = 1;
            } else {
                // 存放字符，为上面判断重复元素的逻辑做准备
                set.add(c);
                // 当前子字符串长度在不断自增
                currentLength++;
            }
        }

        // 最终返回最大的子字符串长度
        return maxLength;
    }
}
